1. Синтаксис указателя на функцию:  
   ReturnType (*PointerName)(ArgTypes...);  
    ReturnType — возвращаемый тип.  
    ArgTypes... — типы аргументов.  

2. Упрощение с using:  
   using FuncPtr = ReturnType(*)(ArgTypes...);  
   FuncPtr ptr = &Function;  

3. Применение указателей на функции:  
    Callback-функции.  
    Полиморфизм времени выполнения.  
   Пример:  
   void execute(void (*func)(int), int x) { func(x); }  

4. Захват переменных в лямбдах:  
    [=] — захват по значению.  
    [&] — захват по ссылке.  
   Пример:  
   int x = 10;  
   auto lambda1 = [=]() { return x; }; // Копия x  
   auto lambda2 = [&]() { return ++x; }; // Ссылка на x  

5. Явное указание возвращаемого типа:  
   Необходимо, если компилятор не может вывести тип автоматически.  
   auto lambda = [](int x) -> double { return x * 1.5; };  

6. Лямбды в STL:  
    std::sort:  
     std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });  
    std::for_each:  
     std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; });  

7. std::function:  
    Предназначен для хранения вызываемых объектов (функций, лямбд).  
    Отличие: поддерживает захват переменных, более гибкий.  

8. Сигнатура std::function:  
   std::function<ReturnType(ArgTypes...)>  
   Пример:  
   std::function<int(int)> func = [](int x) { return x * 2; };  

9. Захват переменных и std::function:  
   Лямбды с захватом можно хранить в std::function, но не в указателях на функции, так как последние требуют фиксированной сигнатуры без состояния.
